package jmine.tec.script.persistent.context;

import jmine.tec.script.ScriptExecutorException;

/**
 * Interface de um contexto de execução de script suficiente para uso pelo usuário. Ao usuário do script bastam métodos para preparar o
 * contexto, passando os parâmetros para sua execução, e despachar sua execução. Portanto, é sugerido que seja criada uma subinterface desta
 * para ser vista como "api" da finalidade de execução descript. O contexto que é a implementação deve portanto implementar esta
 * subinterface descrita e a interface PersistentScriptExecutionContext, que permite que o contexto seja criado e configurado pela fábrica
 * de contextos.
 * 
 * @author lundberg
 * @param <R> tipo de retorno
 */
public interface UserExecutionContext<R> {

    // É aconselhável que o contexto tenha um método "prepare" recebendo os parâmetros que
    // populam o contexto e retornando a si mesmo para method chaining.
    // A assinatura deve ser particular para cada implementação de contexto, para facilitar seu uso.

    /**
     * Executa o contexto e retorna o resultado.
     * 
     * @return result
     * @throws ScriptExecutorException ScriptExecutorException
     */
    R dispatchExecution() throws ScriptExecutorException;

    /**
     * Executa o contexto e retorna as dependências.
     * 
     * @return dependencies
     * @throws ScriptExecutorException ScriptExecutorException
     */
    R dispatchGetDependencies() throws ScriptExecutorException;

    /**
     * Executa o contexto e retorna as validações.
     * 
     * @return validations
     * @throws ScriptExecutorException ScriptExecutorException
     */
    R dispatchGetValidations() throws ScriptExecutorException;

    /**
     * Retorna o Tracer.
     * 
     * @return tracer {@link String}
     */
    String getTracer();
}
